﻿using System;
using System.Collections.Generic;
using Excepciones;
using MJD.Comunes.Entidades;
using MJD.Transaccional.AccesoDatos.Interfaces;
using NHibernate;
using Recursos;

namespace MJD.Transaccional.AccesoDatos.Implementacion.NHibernateMySql
{
    /// <summary>
    /// Clase que implementa los metodos que se declaran en IDaoAseguradora
    /// </summary>
    public class DaoAseguradora: DaoBase<Aseguradora>, IDaoAseguradora
    {

        /// <summary> Metodo que consulta una aseguradora dado los parametros indicados </summary>
        /// <param name="consulta">datos para realizar la consulta de la aseguradora</param>
        /// <returns>Lista de aseguradoras que cumplen con los parametros de busquedas</returns>
        public IList<Aseguradora> ConsultarAseguradora(Aseguradora consulta)
        {
           IList<Aseguradora> retorno = new List<Aseguradora>();

            Aseguradora aseguradora = new Aseguradora();

            aseguradora.Id = 1;
            aseguradora.LetraRif = 'J';
            aseguradora.Nombre = "Prueba 1";
            aseguradora.Rif = 123456789;
            aseguradora.Telefono = "02125503167";
            
            Sucursal sucursal = new Sucursal();

            sucursal.Apartamento = "22";
            sucursal.Calle = "Av. Altamira";
            sucursal.Ciudad = new Ciudad();
            sucursal.Ciudad.Nombre = "Caracas";
            sucursal.Ciudad.Estado = new Estado();
            sucursal.Ciudad.Estado.Nombre = "Distrito Capital";
            sucursal.Edificio = "Meteor";
            sucursal.Piso = "2";
            sucursal.Telefono1 = "02125503167";
            sucursal.Telefono2 = "04123765008";
            sucursal.Tipo = "Principal";
            sucursal.Urbanizacion = "San Bernardino";
            aseguradora.Sucursales = new List<Sucursal>();
            aseguradora.Sucursales.Add(sucursal);
            
            retorno.Add(aseguradora);



            return retorno;
        }


        /// <summary> Metodo que guarda la aseguradora con sus sucursales </summary>
        /// <param name="aseguradora">aseguradora ha almacenar</param>
        /// <returns>true si almaceno</returns>
        public bool AgregrarAseguradoraCompleta(Aseguradora aseguradora)
        {
            bool exito;

            try
            {
                ITransaction tx = Session.BeginTransaction();
                foreach (Sucursal sucursal in aseguradora.Sucursales)
                    Session.SaveOrUpdate(sucursal);
                Session.SaveOrUpdate(aseguradora);
                tx.Commit();
                exito = tx.WasCommitted;
            }
            catch (NullReferenceException e)
            {
                Session.Transaction.Rollback();
                Log.Error(e.Message);
                Log.Error(e.InnerException.Message);

                throw new ExcepcionInfoGuardar(string.Format(RecursoDAO.errGuardarEntidad,"Sucursal"), e);
            }
            catch (Exception e)
            {
                Session.Transaction.Rollback();
                Log.Error(e.Message);
                Log.Error(e.InnerException.Message);
                throw new ExcepcionInfoGuardar(string.Format(RecursoDAO.errGuardarEntidad,"Sucursal"), e);
            }
            finally
            {
                Session.Close();
            }

            return exito;
        }
    }
}
